package impl

import (
	"context"
	"vblog/apps/blog"
	"vblog/conf"
	"vblog/ioc"

	"gorm.io/gorm"
)

// 现在这个业务实现的包,封装完整,并且不对外开放,只能通过ioc访问.
//保证了业务实现的安全

// 声明一个变量_,而不使用它,只是想要它的接口约束
var _ blog.Service = &impl{}

// 定义一个对象(Impl)，由这个对象实现业务功能
// impl 才实现了业务接口声明
// 现在impl对象充当的是mvc里面的控制器
// 控制器实现了一个核心业务方法: CreateBlog等等
type impl struct {
	db *gorm.DB
}

// 业务实例类使用全局配置文件
// 通常为这个实例类 提供初始化方法
// 在配置初始化好后,再调用
func (i *impl) Init() error {
	// 每个业务模块,都建立一个连接池,比较浪费资源
	// 比如这种配置上的全局共享对象,直接通过为这个配置封装方法来进行互用
	db := conf.C().MySQL.ORM()
	i.db = db.Debug()
	return nil
}

func (i *impl) GetDB(ctx context.Context) *gorm.DB {
	// 需要构造SQL查询
	return i.db.WithContext(ctx).Model(&blog.Blog{})
}

// 对象名称
func (i *impl) Name() string {
	return blog.AppName
}

// 怎么把对象托管到Ioc
// 通过import的方式,自动调用包的init方法,把需要托管的对象注册到ioc中
// import _ "vblog/apps/blog/impl"
func init() {
	ioc.RegistryController(&impl{})
}
